package com.malou.client.movimientotiendas;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelFactory;
import com.extjs.gxt.ui.client.data.BeanModelLookup;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.FormButtonBinding;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.form.HiddenField;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyCodes;
import com.malou.client.MalouConstants;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.modeloprenda.ModeloPrendas;

public class MovimientoTiendaDialog extends Dialog {
	
	private Button guardar;
	private Button cancelar;
	public Status status;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	
	public TextField<String> codigoorigen;
	public TextField<String> codigodestino;
	public HiddenField<String> prendaorigen_id;
	public HiddenField<String> prendadestino_id;
	public ComboBox<BeanModel> prendaorigen;
	public ComboBox<BeanModel> prendadestino;	
	private NumberField cantidad;	
	private Button addDetalle;
	private Button delDetalle;
		
	private ListStore<BeanModel> store;
	public Grid<BeanModel> grid;
	private ToolBar toolBar;
	private FormButtonBinding formbuttonbinding;
	private FormPanel panel;
	
	public MovimientoTiendaDialog(){
		setLayout(new FitLayout());
		setIcon(IconHelper.createPath("images/icons/cambio.png"));
		setModal(true);
		setPlain(true);
		setSize(750, 400);
		setClosable(true);
		
		panel = new FormPanel();		
		panel.setBorders(false);
	    panel.setBodyBorder(false);
	    panel.setPadding(5);
	    panel.setHeaderVisible(false);
	    
	    addFields(panel);
	    
	    setButtonAlign(HorizontalAlignment.LEFT);
	    setButtons("");
	    add(panel);
	    
	    setBodyBorder(true);	    
	    setResizable(false);	    
	    setFocusWidget(codigoorigen);
	    	    
		setHeading(constants.movimientoTiendaPrenda());
	}
	
	private void addFields(FormPanel cp) {
	
		ModeloPrendas.autoComplete();
		ModeloPrendas.autoCompletedestino();
		
		
		FieldSet origenFieldSet = new FieldSet();
		origenFieldSet.setHeading(constants.prendaorigen());
		origenFieldSet.setLayout(new ColumnLayout());
		origenFieldSet.setStyleAttribute("marginTop", "8px");
		origenFieldSet.setStyleAttribute("padding", "8px");
		origenFieldSet.setBorders(true);

		FieldSet destinoFieldSet = new FieldSet();
		destinoFieldSet.setHeading(constants.prendadestino());
		destinoFieldSet.setLayout(new ColumnLayout());
		destinoFieldSet.setStyleAttribute("marginTop", "8px");
		destinoFieldSet.setStyleAttribute("padding", "8px");
		destinoFieldSet.setBorders(true);
		
		toolBar = new ToolBar();
		store = new ListStore<BeanModel>();
			   	
		prendaorigen_id = new HiddenField<String>();
		prendadestino_id = new HiddenField<String>();
		
		formbuttonbinding=new FormButtonBinding(panel);
		
		codigoorigen = new TextField<String>();
		codigoorigen.setFieldLabel(constants.movimientoCodigo());		
		codigoorigen.addKeyListener(new KeyListener(){
		public void componentKeyDown(ComponentEvent event){
				if(event.getKeyCode() == KeyCodes.KEY_ENTER){
					if(codigoorigen.getValue() != null){
						ModeloPrendas.getPrendaMovimientoTiendaOrigen(codigoorigen.getValue());
						
					}
				}				
			}
		});
		
		
		codigodestino = new TextField<String>();
		codigodestino.setFieldLabel(constants.movimientoCodigo());		
		codigodestino.addKeyListener(new KeyListener(){
			
			public void componentKeyDown(ComponentEvent event){
				if(event.getKeyCode() == KeyCodes.KEY_ENTER){
					if(codigodestino.getValue() != null){
						ModeloPrendas.getPrendaMovimientoTiendaDestino(codigodestino.getValue());
						
					}
				}				
			}
		});
			
		prendaorigen = new ComboBox<BeanModel>();
		prendaorigen.setFieldLabel(constants.movimientoPrenda());
		prendaorigen.setDisplayField("prenda");			 	    
		prendaorigen.setStore(ModeloPrendas.storeAutocomplete);		
		prendaorigen.setValueField("prenda");
		prendaorigen.setHideTrigger(true);  
		prendaorigen.setPageSize(10);
		prendaorigen.setUseQueryCache(false);
		prendaorigen.setTriggerAction(TriggerAction.ALL);
		prendaorigen.setAllowBlank(false);
		
		prendaorigen.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {
			
			@Override
			public void selectionChanged(SelectionChangedEvent<BeanModel> se) {
				if(se.getSelectedItem() != null){
				codigoorigen.setValue(se.getSelectedItem().get("codigo").toString());
				prendaorigen_id.setValue(se.getSelectedItem().get("id").toString());
				}
			}
		});
		
		prendadestino = new ComboBox<BeanModel>();
		prendadestino.setFieldLabel(constants.movimientoPrenda());
		prendadestino.setDisplayField("prenda");			 	    
		prendadestino.setStore(ModeloPrendas.storeAutocompletedestino);		
		prendadestino.setValueField("prenda");
		prendadestino.setHideTrigger(true);  
		prendadestino.setPageSize(10);
		prendadestino.setUseQueryCache(false);
		prendadestino.setTriggerAction(TriggerAction.ALL);
		prendadestino.setAllowBlank(false);
		
		prendadestino.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {
			
			@Override
			public void selectionChanged(SelectionChangedEvent<BeanModel> se) {
				if(se.getSelectedItem() != null){
				codigodestino.setValue(se.getSelectedItem().get("codigo").toString());
				prendadestino_id.setValue(se.getSelectedItem().get("id").toString());
				}
			}
		});
		
		cantidad = new NumberField();
		cantidad.setFieldLabel(constants.movimientoCantidad());		
		cantidad.setAllowNegative(false);
		cantidad.setAllowBlank(false);
		cantidad.setAllowDecimals(false);
		cantidad.setPropertyEditorType(Integer.class);
		cantidad.setMinValue(1);
		
		addDetalle = new Button(constants.agregar());
		addDetalle.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {
	    	  agregarDetalle();	    	  
	      }
	    });
		
		
		
		origenFieldSet.add(setLayout(codigoorigen, "98%",50),	new ColumnData(.32));
		origenFieldSet.add(setLayout(prendaorigen, "93%", 50),new ColumnData(.5));
		origenFieldSet.add(setLayout(cantidad, "85%", 50),new ColumnData(.18));

		destinoFieldSet.add(setLayout(codigodestino, "98%", 50), new ColumnData(.4));
		destinoFieldSet.add(setLayout(prendadestino, "93%", 50),new ColumnData(.5));
		destinoFieldSet.add(setLayout(addDetalle, "100%", 0),new ColumnData(.1));
		
		Component comp[]={codigoorigen,prendaorigen,cantidad,codigodestino,prendadestino,addDetalle};
		Utilities.Enter(comp);
		
	    
	    
	    delDetalle = new Button(constants.eliminar(), IconHelper.createPath("images/icons/delete.gif"));
	    delDetalle.setEnabled(false);
	    formbuttonbinding.addButton(addDetalle);
        
        SelectionListener<ButtonEvent> sl_del;        
        sl_del = new SelectionListener<ButtonEvent>(){
        	
        	@Override
			public void componentSelected(ButtonEvent ce) {		
				BeanModel be =grid.getSelectionModel().getSelectedItem();
				grid.getStore().remove(be);
			}
        };
        delDetalle.addSelectionListener(sl_del);
        
        toolBar.add(delDetalle);
	    
	    ArrayList<ColumnConfig> columns = new ArrayList<ColumnConfig>();
	    
	    RowNumberer r = new RowNumberer();
	    columns.add(r);
	    columns.add(new ColumnConfig("modeloprendaorigen", constants.prendaorigen(), 300));
		columns.add(new ColumnConfig("modeloprendadestino", constants.prendadestino(), 300));
		columns.add(new ColumnConfig("cantidad", constants.movimientoCantidad(), 80));
       
        ColumnModel cm = new ColumnModel(columns);       
        
        grid = new Grid<BeanModel>(store, cm);
        grid.addPlugin(r);  
        grid.setAutoExpandColumn("cantidad");
        grid.getSelectionModel().addListener(Events.SelectionChange, new Listener<SelectionChangedEvent<BeanModel>>(){

			@Override
			public void handleEvent(SelectionChangedEvent<BeanModel> be) {				
				if(be.getSelectedItem() != null)
					delDetalle.setEnabled(true);
				else
					delDetalle.setEnabled(false);
			}
		});
        
        ContentPanel detalle = new ContentPanel();
        detalle.setHeaderVisible(false);
        detalle.setLayout(new FitLayout());
        detalle.setHeight(200);
        detalle.add(grid);
        detalle.setTopComponent(toolBar);        
        
        
        cp.add(origenFieldSet);
        cp.add(destinoFieldSet);
	    cp.add(detalle);
	    
	}
	
	@Override
	  protected void createButtons() {
	    super.createButtons();
	    
	    if (constants == null) {
	    	constants = GWT.create(MalouConstants.class);
		}
	    
	    status = new Status();
	    status.setBusy(constants.guardando());
	    status.hide();
	    status.setAutoWidth(true);
	    getButtonBar().add(status);
	    
	    getButtonBar().add(new FillToolItem());
	    
	    cancelar = new Button(constants.cancelar());
	    
	    cancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {	    	  
	    	  MovimientoTiendaDialog.this.hide();
	      }

	    });

	    guardar = new Button(constants.guardar());
	    
	    
	    guardar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {
	    	  if(validarPrincipal()){
	    		  status.show();
	    		  getButtonBar().disable();
	    		  
	    		  List<MovimientoTienda> list = new ArrayList<MovimientoTienda>(); 
	    		  MovimientoTienda mt;
	    		  	    		  
	    		  for(BeanModel b:store.getModels()){
	    			  mt = new MovimientoTienda();
	    			  mt.setModeloprendaorigen_id(Integer.valueOf(b.get("modeloprendaorigen_id").toString()));
	    			  mt.setModeloprendadestino_id(Integer.valueOf(b.get("modeloprendadestino_id").toString()));
	    			  mt.setCantidad(Integer.valueOf(b.get("cantidad").toString()));
	    			  mt.setFecha(new Date());
	    			  list.add(mt);	    			  
	    		  }	    		  
	    		  
	    		  MovimientoTiendas.movimientoTiendaDialog = MovimientoTiendaDialog.this;
	    		  MovimientoTiendas.save(list);
	    	  }	    	  
	      }
	    });
	    
	    addButton(guardar);
	    addButton(cancelar);	    
	    
	  }
	

	
	public boolean validarPrincipal(){
		
		boolean det = true;
		if(store.getCount()==0){
			det = false;
			MessageBox.alert(constants.sistemaMarcocruzado(), constants.detalleRequerido(), null);
		}
		
	
		
		return det;
	}
	
	public void clearDetalle(){
		  		  
		codigodestino.clear();
		codigoorigen.clear();
		prendadestino.clear();
		prendaorigen.clear();
		cantidad.clear();
		
		  
	 }
	public void clearPrincipal(){
		store.removeAll();
		clearDetalle();
	 }
	
	public void agregarDetalle(){
		
		 Boolean add = true;
   	  if(store.getCount() > 0 ){
   		  String po_id = prendaorigen_id.getValue();
   		  String pd_id = prendadestino_id.getValue();
   		  Integer cant = Integer.valueOf(cantidad.getValue().toString());	    		  
   		  
   		  String podetalle_id;
   		  String pddetalle_id;
   		  Integer cantdetalle;
   		  for(BeanModel b:store.getModels()){
   			podetalle_id = b.get("modeloprendaorigen_id").toString();
   			pddetalle_id = b.get("modeloprendadestino_id").toString();
   			  
   			  if(podetalle_id.equals(po_id) && pddetalle_id.equals(pd_id)){
   				  
   				  add = false;	    				
   				  cantdetalle = b.get("cantidad");
   				  store.getRecord(b).set("cantidad", cantdetalle+cant);
   				  store.commitChanges();
   				  clearDetalle();
   				  codigoorigen.focus();
   				  break;
   			  }
   		  }
	
   	  }
		if(add){
		   		  MovimientoTienda dm = new MovimientoTienda();
	    		  dm.setModeloprendaorigen_id(Integer.valueOf(prendaorigen_id.getValue()));
	    		  dm.setModeloprendadestino_id(Integer.valueOf(prendadestino_id.getValue()));
	    		  dm.setCantidad(Integer.valueOf(cantidad.getValue().toString()));
		    	  dm.setModeloprendadestino(prendadestino.getValue().get("prenda").toString());
		    	  dm.setModeloprendaorigen(prendaorigen.getValue().get("prenda").toString());
		    	  
		    	  BeanModelFactory beanModelFactory =  BeanModelLookup.get().getFactory(dm.getClass());
		    	  store.add(beanModelFactory.createModel(dm));
		    	  clearDetalle();
	    	  codigoorigen.focus();
  	  }
	}
	
	
	 private LayoutContainer setLayout(Component comp, String porcentaje,Integer withlabel) {
			LayoutContainer layout = new LayoutContainer();
			FormLayout fl = new FormLayout(LabelAlign.LEFT);
			fl.setLabelWidth(withlabel);
			layout.setLayout(fl);
			layout.add(comp, new FormData(porcentaje));

			return layout;
		}
}
